package thread.example3;

/*

                1):Java中类可以多实现接口,此时该类还可以继承其他类,并且还可以实现其他接口(设计上,更优雅).
                        2):从操作上分析,实现方式稍微复杂点,获取线程名字也比较复杂,得使用Thread.currentThread()来获取当前线程的引用.
                        3):从多线程共享同一个资源上分析,实现方式可以做到(是否共享同一个资源).
*/

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class RunnableDemo {
    public static void main(String[] args) {
        Apple a = new Apple();

        new Thread(a, "A").start();
        new Thread(a, "B").start();
        new Thread(a, "C").start();
    }

}

class Apple implements Runnable {



    private  int num = 50;

    @Override
    public void run() {

        for (int i = 0; i < 50; i++) {
   /*         //方式1：同步锁   this 表示当前苹果对象 该对象属于共享资源
            synchronized (Apple.class) { //this
            if (num > 0) {
                try {
                    Thread.sleep(10L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                    //获取线程名字比较复杂
                    System.out.println(Thread.currentThread().getName() + "吃了" + num-- + "号苹果");
                }
            }*/

        // 方式2：同步方法
           eat();
        }
    }

/*    private synchronized void eat() {
        if (num > 0) {
            try {
                Thread.sleep(10L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "吃了" + num-- + "号苹果");
        }
    }*/

    //方式3 同步锁
    private final Lock lock = new ReentrantLock();//创建一个锁对象

    private  void eat() {
        lock.lock();
            try {
                if (num > 0) {  //if放到 try cathc中 不然最后一次判断 锁住了不会释放
                Thread.sleep(10L);
                System.out.println(Thread.currentThread().getName() + "吃了" + num-- + "号苹果");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();

        }
    }

}
